[Lambda] 最新版のSDK(Boto3)をLambda関数で利用してみた
はじめに
AWSチームのすずきです。
AWS Lambda では、Python 向けの AWS SDK (Boto 3) をデフォルトで利用する事が可能ですが、 リリース直後のAWSの新機能を利用する際、最新バージョンのSDKが必要となる場合があります。
今回、最新版のBoto3をデプロイパッケージに含めたLambda関数を作成し、その動作を確認する機会がありましたので、紹介させて頂きます。
実行環境
- OS: Amazon Linux AMI release 2016.09
- IAMロール : Adminロール相当を割当済
- パッケージ: 「jq」導入済
- AWSリージョン: us-west-2 (oregon)を利用
手順
boto3 インストール
- 作業ディレクトリを作成し、インストール先を指定してboto3をインストールします
- virtualenvは利用しませんでした。
WORKDIR=~/test-boto3 mkdir -p ${WORKDIR} pip install boto3 -t ${WORKDIR}
サンプルコード設置
- 作業ディレクトリにテストコードを設置します
- ALB対応のWAF(waf-regional)、変更用のトークンを取得するサンプルを用意しました
tee ${WORKDIR}/test-boto3.py <<EOF import boto3 def lambda_handler(event, context): client = boto3.client('waf-regional', region_name='ap-northeast-1') r = client.get_change_token() print(r) EOF
デプロイパッケージ作成
- boto3, サンプルコードを含む作業ディレクトリ直下をそのままパッケージ化します
cd ${WORKDIR} zip -r ~/test-boto3.zip .
Lambda用ロール設置
- Lambda関数に付与する、WAFの操作権限をもつロールを作成します
- ロール名は「lambda-waf-fullaccess」としています
aws iam create-role --role-name lambda-waf-fullaccess \ --assume-role-policy-document '{"Version":"2012-10-17","Statement":[{"Action":"sts:AssumeRole","Principal":{"Service":"lambda.amazonaws.com"},"Effect":"Allow","Sid":""}]}' aws iam attach-role-policy \ --role-name lambda-waf-fullaccess \ --policy-arn arn:aws:iam::aws:policy/AWSWAFFullAccess
Lambda関数作成
- 作成したデプロイパッケージ、Lambda用ロールを指定して、Lambda関数を作成します。
AWSAccount=`aws sts get-caller-identity | jq -r .Account` LambdaRoleARN="arn:aws:iam::${AWSAccount}:role/lambda-waf-fullaccess" aws lambda create-function \ --region us-west-2 \ --function-name test-boto3 \ --zip-file fileb://~/test-boto3.zip \ --role ${LambdaRoleARN} \ --handler test-boto3.lambda_handler \ --runtime python2.7 \ --timeout 10 \ --memory-size 128
動作確認
- Lambdaの実行ログ、Tail指定で取得し、デコードした結果を確認
aws lambda invoke \ --invocation-type RequestResponse \ --function-name test-boto3 \ --region us-west-2 \ --log-type Tail /tmp/tmp.txt \ | jq -r .LogResult | base64 -d
- 出力結果
START RequestId: 845cfac9-c437-11e6-b237-xxxxxxxxxxxx Version: $LATEST {u'ChangeToken': u'c3ba717d-d5a0-4ad1-b1d8-xxxxxxxxxxxx', 'ResponseMetadata': {'RetryAttempts': 0, 'HTTPStatusCode': 200, 'RequestId': '852ef067-c437-11e6-bcfb-xxxxxxxxxxxx', 'HTTPHeaders': {'x-amzn-requestid': '852ef067-c437-11e6-bcfb-xxxxxxxxxxxx', 'date': 'Sat, 17 Dec 2016 09:02:21 GMT', 'content-length': '54', 'content-type': 'application/x-amz-json-1.1'}}} END RequestId: 845cfac9-c437-11e6-b237-xxxxxxxxxxxx REPORT RequestId: 845cfac9-c437-11e6-b237-xxxxxxxxxxxx Duration: 1054.04 ms Billed Duration: 1100 ms Memory Size: 128 MB Max Memory Used: 27 MB
まとめ
デプロイパッケージにAWS SDK(boto3)を組み込む事で、Lambda関数のコードサイズは5MBほど増量。僅かですが実行時間も増加する傾向が確認されました。
デフォルトで組み込まれているSDKが更新されるまでの暫定処置、ワークアラウンドとしてご利用ください。
参考
- 2016/12/17時点、Lambdaデフォルトで利用出来るSDK(boto3)は「waf-regional」に非対応でした。
手順
cd ${WORKDIR} zip -r ~/test-without-boto3.zip test-boto3.py aws lambda create-function \ --region us-west-2 \ --function-name test-without-boto3 \ --zip-file fileb://~/test-without-boto3.zip \ --role ${LambdaRoleARN} \ --handler test-boto3.lambda_handler \ --runtime python2.7 \ --timeout 10 \ --memory-size 128 aws lambda invoke \ --invocation-type RequestResponse \ --function-name test-without-boto3 \ --region us-west-2 \ --log-type Tail /tmp/tmp.txt \ | jq -r .LogResult | base64 -d
結果
- エラー抜粋
UnknownServiceError: Unknown service: 'waf-regional'. Valid service names are: acm, apigateway, application-autoscaling, appstream, autoscaling, budgets, cloudformation, cloudfront, cloudhsm, cloudsearch, cloudsearchdomain, cloudtrail, cloudwatch, codebuild, codecommit, codedeploy, codepipeline, cognito-identity, cognito-idp, cognito-sync, config, datapipeline, devicefarm, directconnect, discovery, dms, ds, dynamodb, dynamodbstreams, ec2, ecr, ecs, efs, elasticache, elasticbeanstalk, elastictranscoder, elb, elbv2, emr, es, events, firehose, gamelift, glacier, health, iam, importexport, inspector, iot, iot-data, kinesis, kinesisanalytics, kms, lambda, lightsail, logs, machinelearning, marketplacecommerceanalytics, meteringmarketplace, opsworks, opsworkscm, pinpoint, polly, rds, redshift, rekognition, route53, route53domains, s3, sdb, servicecatalog, ses, shield, sms, snowball, sns, sqs, ssm, stepfunctions, storagegateway, sts, support, swf, waf, workspaces, xray